package com.rayframework.context.utils;

import com.ray.tool.RayConsole;
import com.ray.tool.RayStringTools;

import com.rayframework.context.RayApplicationContext;
import com.rayframework.core.common.constant.RayCoreConstants;

import java.net.URL;

/**
 * Ray 框架启动类 工具类
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/9/28 10:12
 **/
public class RayContextUtils {
    /**
     * 工具类中的方法都是静态方法访问的，因此将构造器私有不允许创建对象
     *
     * @author LiaoYuXing-Ray 2023/9/7 10:28
     */
    private RayContextUtils() {
        throw new AssertionError();
    }

    /**
     * 获取引用本框架的jar包的绝对路径
     *
     * @return 获取本框架jar包绝对路径
     * @author LiaoYuXing-Ray 2023/9/7 17:01
     */
    public static String getRayJar() {
        String jarPath = "";
        // 获取当前项目的类加载器
        ClassLoader classLoader = RayContextUtils.class.getClassLoader();
        // 获取资源文件的URL 因为Ray.properties文件不会出现在用户里，所以会走jar包 TODO 后续添加一个判断，如果用户有，直接给他删了，并提示一下不能创建该文件
        URL resourceUrl = classLoader.getResource(RayCoreConstants.RAY_PROPERTIES);
        // 输出资源文件的绝对路径
        if (resourceUrl != null) {
            String path = resourceUrl.getPath();
            if (RayStringTools.isNotBlank(path)) {
                // 获取jar包的文件路径
                if (path.contains(".jar!")) {
                    int lastIndex = path.lastIndexOf(".jar!");
                    jarPath = path.substring(6, lastIndex + 4); // 去掉File:/ 和 .jar!的!
                }
            }
        }
        return jarPath;
    }

    /**
     * 检查某个propertyKey配置的value是否为true
     * value建议为 boolean 类型
     * 如果为其它类型均返回false
     *
     * @return 是否为true
     * @author LiaoYuXing-Ray 2023/9/12 15:55
     */
    public static boolean checkProperty(String propertyKey) {
        return Boolean.parseBoolean(RayApplicationContext.getApplicationPropertyValue(propertyKey));
    }

    /**
     * 替换 propertyKey 中的 . Ray init use 字符
     * 如：Ray.init.MyBatisPlus.use 返回 MyBatisPlus
     *
     * @param propertyKey 配置key
     * @return 替换后的字符串
     * @author LiaoYuXing-Ray 2023/9/13 14:27
     */
    public static String propertyKeyReplace(String propertyKey) {
        return propertyKey.replaceAll("\\.|\\s*Ray|\\s*init|\\s*use", "");
    }

    /**
     * 检查配置中是否使用 某propertyKey配置 并输出警告
     *
     * @return boolean true为使用，false为不使用
     * @author LiaoYuXing-Ray 2023/9/12 16:10
     **/
    public static boolean checkPropertyUse(String propertyKey) {
        boolean flag = checkProperty(propertyKey);
        if (!flag) {
            RayConsole.warn("框架配置设置了不允许使用" + propertyKeyReplace(propertyKey)
                    + "：" + propertyKey + "=false");
        }
        return flag;
    }


}
